package Soligee.model.vo.lancamentos;

import Soligee.model.vo.cadastros.FornecedorVO;
import Soligee.model.vo.cadastros.RepresentanteVO;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Collection;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "pedidocompra")
public class PedidoCompraVO implements Serializable {

   @Id
   @SequenceGenerator(name = "cod_pedido_compra", sequenceName = "cod_pedido_compra_seq", allocationSize = 1)
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_pedido_compra")
   @Column(name = "cod_pedido_compra")
   private int codPedido;

   @Column(name = "data_emissao")
   @Temporal(TemporalType.DATE)
   private Date dataEmissao;

   @Column(name = "data_recebimento")
   @Temporal(TemporalType.DATE)
   private Date dataRecebimento;

   @Column(name = "percent_frete")
   private double percentFrete;

   @Column(name = "percent_desc")
   private double percentDesc;

   @Column(name = "percent_embal")
   private double percentEmbalagem;

   @Column(name = "valor_total_itens")
   private double valorTotalItens;

   @Column(name = "valor_total_pedido")
   private double valorTotalPedido;

   @Column(name = "ativo")
   private boolean ativo;

   @OneToMany(mappedBy = "pedidocompra", fetch = FetchType.EAGER, cascade = {javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.MERGE})
   @Fetch(FetchMode.SELECT)
   @Cascade(CascadeType.LOCK)
   private Collection<ItensCompraVO> itenscompra;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "cod_fornecedor")
   @Cascade(CascadeType.LOCK)
   @Fetch(FetchMode.JOIN)
   private FornecedorVO fornecedor;

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "cod_representante")
   @Cascade(CascadeType.LOCK)
   @Fetch(FetchMode.JOIN)
   private RepresentanteVO representante;

   @ManyToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "cod_forma_pagamento")
   @Cascade(CascadeType.LOCK)
   @Fetch(FetchMode.SELECT)
   private FormaPagamentoVO formaPagamento;

   public PedidoCompraVO() {
      fornecedor = new FornecedorVO();
      representante = new RepresentanteVO();
      formaPagamento = new FormaPagamentoVO();
      itenscompra = new ArrayList<ItensCompraVO>();

   }

   public PedidoCompraVO(int codPedido, Date dataEmissao, Date dataRecebimento, FornecedorVO fornec, RepresentanteVO rep,
           FormaPagamentoVO formaPagamento, double percentFrete, double percentDesc, double percentEmbalagem,
           double valorTotalItens, double valorTotalPedido) {

      this.setCodPedido(codPedido);
      this.setDataEmissao(dataEmissao);
      this.setDataRecebimento(dataRecebimento);
      this.setFornecedor(fornec);
      this.setRepresentante(rep);
      this.setPercentFrete(percentFrete);
      this.setPercentDesc(percentDesc);
      this.setPercentEmbalagem(percentEmbalagem);
      this.setValorTotalItens(valorTotalItens);
      this.setValorTotalPedido(valorTotalPedido);
      this.setFornecedor(fornec);
      this.setFormaPagamento(formaPagamento);
      this.setAtivo(true);
   }

   public PedidoCompraVO(int codPedido, Date dataEmissao, Date dataRecebimento, int fornec, int rep,
           int formaPagamento, double percentFrete, double percentDesc, double percentEmbalagem,
           double valorTotalItens, double valorTotalPedido) {


      this.setCodPedido(codPedido);
      this.setDataEmissao(dataEmissao);
      this.setDataRecebimento(dataRecebimento);
      representante = new RepresentanteVO();
      this.getRepresentante().setCodPessoa(rep);
      fornecedor = new FornecedorVO();
      this.getFornecedor().setCodPessoa(fornec);
      this.setPercentFrete(percentFrete);
      this.setPercentDesc(percentDesc);
      this.setPercentEmbalagem(percentEmbalagem);
      this.setValorTotalItens(valorTotalItens);
      this.setValorTotalPedido(valorTotalPedido);
      this.formaPagamento = new FormaPagamentoVO();
      this.formaPagamento.setCodFormaPagamento(formaPagamento);
      this.setAtivo(true);
   }

   public int getCodPedido() {
      return codPedido;
   }

   public void setCodPedido(int codPedido) {
      this.codPedido = codPedido;
   }

   public Date getDataEmissao() {
      return dataEmissao;
   }

   public void setDataEmissao(Date dataEmissao) {
      this.dataEmissao = dataEmissao;
   }

   public Date getDataRecebimento() {
      return dataRecebimento;
   }

   public void setDataRecebimento(Date dataRecebimento) {
      this.dataRecebimento = dataRecebimento;
   }

   public double getPercentDesc() {
      return percentDesc;
   }

   public void setPercentDesc(double percentDesc) {
      this.percentDesc = percentDesc;
   }

   public double getPercentEmbalagem() {
      return percentEmbalagem;
   }

   public void setPercentEmbalagem(double percentEmbalagem) {
      this.percentEmbalagem = percentEmbalagem;
   }

   public double getPercentFrete() {
      return percentFrete;
   }

   public void setPercentFrete(double percentFrete) {
      this.percentFrete = percentFrete;
   }

   public double getValorTotalItens() {
      return valorTotalItens;
   }

   public void setValorTotalItens(double valorTotalItens) {
      this.valorTotalItens = valorTotalItens;
   }

   public double getValorTotalPedido() {
      return valorTotalPedido;
   }

   public void setValorTotalPedido(double valorTotalPedido) {
      this.valorTotalPedido = valorTotalPedido;
   }

   public Collection<ItensCompraVO> getItenscompra() {
      return itenscompra;
   }

   public boolean isAtivo() {
      return ativo;
   }

   public void setAtivo(boolean ativo) {
      this.ativo = ativo;
   }

   public FornecedorVO getFornecedor() {
      return fornecedor;
   }

   public void setFornecedor(FornecedorVO fornecedor) {
      this.fornecedor = fornecedor;
   }

   public RepresentanteVO getRepresentante() {
      return representante;
   }

   public void setRepresentante(RepresentanteVO representante) {
      this.representante = representante;
   }

   public void setItenscompra(Collection<ItensCompraVO> itenscompra) {
      this.itenscompra = itenscompra;
   }

   public FormaPagamentoVO getFormaPagamento() {
      return formaPagamento;
   }

   public void setFormaPagamento(FormaPagamentoVO formaPagamento) {
      this.formaPagamento = formaPagamento;
   }

   public void adicionaItem(ItensCompraVO itemCompra){
      List <ItensCompraVO> lista = (List<ItensCompraVO>) this.itenscompra;
      for(int i=0; i<lista.size(); i++){
         if(itemCompra.getDescricaoProduto().equals(lista.get(i).getDescricaoProduto())){
            itemCompra.setCodItensCompra(lista.get(i).getCodItensCompra());
            lista.remove(i);
            lista.add(i, itemCompra);
         }
      }
      setItenscompra(lista);
   }
}
